Solution de messagerie web (nginx+rainloop)

 

Nous avons maintenant notre solution de messagerie opérationnelle, mais il nous faut une interface pour lire nos mails. Il y a généralement deux solutions pour cela, soit on utilise un client de messagerie sur notre machine comme outlook, mail ou thunderbird, soit nous utilisons un webmail qui est un site web installé la plupart du temps directement sur le serveur de messagerie et qui permet de consulter ses mails en ligne, comme gmail, yahoo ou outlook.com.

Dans notre cas, nous allons opter pour la seconde solution du webmail, bien que la première puisse être aussi utilisée, mais elle nécessiterait un peu de sécurisation complémentaire pour être efficace.

Avant de pouvoir installer notre webmail, il faut déjà que l'on ait un serveur web à notre disposition. Si vous avez bien suivi le cours depuis le premier ouvrage, vous serez un pro de l'installation d'apache2. Cependant, vu que vous êtes ici pour apprendre, nous allons utiliser un autre serveur web qui est en vogue en ce moment, il s'agit de nginx (prononcer engineX, comme un moteur en anglais)

Installation du serveur web

Le package pour installer nginx est... nginx !

root@Debian02:~# apt-get install nginx

Cependant, comme pour apache2, par défaut nginx n'interprète pas le PHP, il faut pour cela installer un package complémentaire qui fasse la liaison entre le serveur web et l'interpréteur PHP. Il s'agit de php-fpm. A vous de trouver la version correspondant à votre système, pour ma part il s'agit de php7.0.

root@Debian02:~# apt-get -y install php7.0-fpm

Nous pouvons vérifier si le serveur est bien en écoute :

root@Debian02:~# ss -antp

State Recv-Q Send-Q Local Address:Port Peer Address:Port

[...]

LISTEN 0 128 *:80 *:* users:(("nginx",pid=15292,fd=6),("nginx",pid=15291,fd=6))

[...]

LISTEN 0 128 :::80 :::* users:(("nginx",pid=15292,fd=7),("nginx",pid=15291,fd=7))

[...]

Le port 80 qui correspond à notre serveur web est bien en écoute, nous pouvons donc tester notre connexion à notre serveur avec notre navigateur préféré en indiquant l'adresse IP de notre serveur :

Page de connexion web à notre serveur nginxPage de connexion web à notre serveur nginx
 
Ça marche ! notre serveur est en place 
:D:D
 

Attention cependant, si votre machine est une machine virtuelle, il faut que vous fassiez en sorte de la rendre accessible, comme dans la quatrième partie du  cours précédent "Apprenez le fonctionnement des réseaux TCP/IP"

Il nous reste à vérifier qu'il interprète correctement le PHP car le webmail que l'on souhaite installer est codé en PHP. Pour cela, il va déjà falloir indiquer à notre serveur qu'il peut prendre en compte les pages d'index en PHP. Nous allons simplement ajouter index.php comme pages par défaut, et cela se fait dans le virtualhost par défaut /etc/nginx/sites-available/default sur la ligne qui commence par index :

# Add index.php to the list if you are using PHP

index index.php index.html index.htm index.nginx-debian.html;

Il faut ensuite ajouter la prise en compte de PHP en dé-commentant les lignes correspondant à PHP-fpm, dans le même fichier default :

 # pass PHP scripts to FastCGI server

 #

 location ~ \.php$ {

 include snippets/fastcgi-php.conf;

 

 # With php-fpm (or other unix sockets):

 fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;

 # # With php-cgi (or other tcp sockets):

 # fastcgi_pass 127.0.0.1:9000;

 }

Il faut ensuite re-démarrer le serveur pour que les modifications soient prises en compte:

root@Debian02:~# systemctl restart nginx

Pour tester, nous allons simplement créer une nouvelle page en php à la racine du serveur.

Mais où se situe-t-elle ?

Vous avez maintenant l'habitude, toutes les informations de base sont situées dans les fichiers de configuration, et ici notamment dans le fichier de virtualhost par défaut, nous pouvons lire :

root /var/www/html;

Les pages devraient donc se trouver dans ce répertoire :

root@Debian02:/var/www/html# ls -la /var/www/html

total 3

drwxr-xr-x 4 root root 4096 avril 4 15:30 .

drwxr-xr-x 3 root root 4096 mars 29 10:58 ..

-rw-r--r-- 1 root root 612 mars 29 10:58 index.nginx-debian.html

On y retrouve bien notre page par défaut vue auparavant.

Pour tester si le PHP est bien interprété, rien de plus simple, nous allons créer une page PHP qui ne contient qu'un appel à une fonction de base :

root@Debian02:/var/www/html# vim /var/www/html/index.php

Puis y rentrer nos informations php :

<?php

phpinfo();

?>

C'est relativement simpliste !

Mais regardons le résultat :

Page web représentant notre appel à phpinfo()Page web représentant notre appel à phpinfo()
 

Notre fonction phpinfo() a bien été interprétée, le PHP est donc bien installé.

Nous allons pouvoir passer à l'installation du webmail.

Installation du webmail

Il existe aujourd'hui de nombreux webmails qui offrent chacun des fonctionnalités diverses et variées. L'avantage de notre solution est qu'elle peut fonctionner avec la plupart des webmails existants, donc si celui que nous allons installer ne vous plait pas, vous restez libre d'en installer un autre, ou même d'en installer plusieurs si vous le souhaitez !

Pour notre mise en place, j'ai choisi Rainloop. C'est un webmail très simple et performant, et il a l'avantage de ne pas nécessiter d'installation de base de données, tant que l'on ne veut pas gérer de contacts. Pour l'installation de la plupart des autres webmails, ils vous faudra créer les bases de données nécessaires à leur fonctionnement.

Récupération des outils nécessaires et installation de rainloop

Dans un premier temps, vous allez devoir installer les outils nécessaires à l'installation de rainloop. Nous aurions pu faire comme dans le chapitre sur SMTP et régler les problèmes un à un au fur et à mesure que nous les rencontrions, mais je vous propose d'utiliser directement les commandes correctes afin de gagner du temps.

Il nous faut donc d'abord installer deux packages liés à PHP qui vont nous permettre par la suite d'installer facilement rainloop.

root@Debian02:~# apt-get install php-curl php-xml curl

Il nous faut ensuite créer les répertoires dans lequel rainloop va être installé, ainsi qu'un répertoire pour les logs.

root@Debian02:~# mkdir -p /var/www/rainloop/{public_html,logs}

Nous allons ensuite utiliser la commande curl pour installer rainloop vu que c'est ce qui est conseillé de faire par les développeurs de rainloop :

root@Debian02:~# cd /var/www/rainloop/public_html

root@Debian02:~# curl -sL https://repository.rainloop.net/installer.php | php

#!/usr/bin/env php

 

 

 [RainLoop Webmail Installer]

 

 

 * Connecting to repository ...

 * Downloading package ...

 * Complete downloading!

 * Installing package ...

 * Complete installing!

 

 * [Success] Installation is finished!

La commande curl permet de faire une requête web et de récupérer le résultat sous forme de fichier.

Ici, nous allons récupérer le fichier installer.php sur le site de rainloop, et nous allons ensuite l'exécuter avec la commande php. Ce script PHP va récupérer les sources du programme rainloop et installer les bons fichiers avec les bons droits au bons endroits, c'est à dire là où nous avons lancé la commande 
;);)
 

Et comme vous pouvez le voir, tout s'est bien passé !

Nous allons ensuite faire en sorte que notre webmail soit visible en tant que site web, et pour cela nous allons créer spécifiquement un virtualhost.

Création d'un virtualhost dédié pour notre webmail

Actuellement, la racine de notre serveur web est /var/www/html/, or nous avons installé rainloop dans /var/www/rainloop, qui est donc hors de la racine de notre serveur web. Rainloop est donc pour l'instant invisible pour notre serveur web.

Pour pouvoir le rendre accessible, nous allons créer un virtualhost spécifique qui va pointer dans notre répertoire d'installation /var/www/rainloop/public_html/

La création d'un virtualhost avec nginx est proche de la façon dont nous l'avons fait avec apache. Nous allons créer un fichier virtualhost dans le répertoire sites-available de configuration de nginx, puis nous ferons un lien dans le répertoire sites-enabled.

root@Debian02:~# vim /etc/nginx/sites-available/rainloop

Et nous allons y insérer les informations suivantes :

server {

 server_name rainloop.domaine.com;

 listen 80;

 root /var/www/rainloop/public_html;

 access_log /var/www/rainloop/logs/access.log;

 error_log /var/www/rainloop/logs/error.log;

 index index.php;

 

 location / {

 try_files $uri $uri/ /index.php?$query_string;

 }

 

 location ~ \.php$ {

 include snippets/fastcgi-php.conf;

 

 # With php-fpm (or other unix sockets):

 fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;

 # fastcgi_index index.php;

 # fastcgi_split_path_info ^(.+\.php)(.*)$;

 # fastcgi_keep_conn on;

 # include /etc/nginx/fastcgi_params;

 # fastcgi_pass unix:/var/run/php5-fpm.sock;

 # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

 }

 

 location ~ /\.ht {

 deny all;

 }

 

 location ^~ /data {

 deny all;

 }

 

}

Le format de notre virtualhost est le même que le fichier default. Nous indiquons un server_name qui sera à indiquer dans l'URL pour accéder à rainloop. Nous indiquons aussi où se trouve la racine de notre virtualhost, et nous activons le PHP. Enfin, nous interdisons l'accès à tout fichier de type .htaccess ou au répertoire data.

Il faut ensuite activer ce virtualhost en créant le lien dans sites-enabled :

root@Debian02:~# ln -s /etc/nginx/sites-available/rainloop /etc/nginx/sites-enabled/rainloop

Vous pouvez relancer le service nginx pour que nos modifications de configuration soient prises en compte :

root@Debian02:~# systemctl restart nginx

Mais attention ! notre virtualhost n'est pour l'instant accessible qu'avec le nom rainloop.domaine.com. Or nous ne possédons pas ce domaine.

Cependant, vous savez déjà comment procéder car nous avions rencontré le même problème dans le cours précédent quand nous avons abordé la notion de virtualhost. Vous allez pouvoir entrer ce nom dans le fichier hosts de la machine qui accède au webmail. Il faudra faire la liaison entre le nom rainloop.domaine.com et l'adresse IP de votre serveur.

Une fois que vous aurez réalisé cette manipulation, vous pourrez accéder à votre webmail, notamment pour le configurer !

Page de connexion de rainloopPage de connexion de rainloop
 

Configuration du webmail

Pour se connecter à la console d'administration, il faut ajouter ?admin dans l'URL, ce qui donne pour nous http://rainloop.domaine.fr/?admin

Le login/mot de passe par défaut est admin/12345.

Si tout s'est bien passé, vous voilà connecté :

Page d'accueil de l'administration de rainloopPage d'accueil de l'administration de rainloop
 

Changement du mot de passe admin

La première chose que nous allons faire est de changer le mot de passe d'admin pour éviter les robots qui testent au hasard le login/mot de passe de base. Pour cela on clique dans l'encadré jaune sur change.

Une fois la rubrique "Admin Panel Access Credentials" remplie, vous pouvez valider pour changer le mot de passe. Attention, vous avez la possibilité de changer aussi le nom de l'utilisateur administrateur de rainloop, mais dans notre cas je vous conseille de garder admin. De plus, si votre serveur est accessible sur Internet, je vous invite à utiliser un mot de passe complexe.

Ensuite, nous allons passer aux éléments de configuration de notre webmail

Configuration pas à pas

Nous allons parcourir chacun des menus un à un.

D'abord, nous choisissons la langue dans le menu "Général" pour choisir le français (ou ce qu'il vous plaira !)

Nous allons ensuite aller dans la rubrique "Domaines" qui est très importante puisque c'est là que nous allons indiquer toutes les informations de notre serveur.

Nous commençons par ajouter un domaine, puis nous allons renseigner toutes les informations IMAP et SMTP permettant de se connecter à notre serveur :

On ajoute le domaine itinet.frOn ajoute le domaine itinet.fr
 

Notre serveur est ici localhost, vu que nos serveurs IMAP et SMTP sont installés sur la même machine que notre serveur web. Il faut ensuite décocher la case "Utiliser l'authentification" vu que notre serveur SMTP a été configuré sans authentification. Vous pouvez ensuite cliquer sur "Ajouter" pour ajouter le nouveau domaine, qui apparait maintenant dans la liste des domaines :

On peut voir notre domaine itinet.frOn peut voir notre domaine itinet.fr
 

Notre webmail est d'ors et déjà fonctionnel, mais nous allons encore ajouter quelques modifications.

Dans la rubrique "identifiant", vous pouvez indiquer le domaine itinet.fr si vous le souhaitez, vous pourrez ainsi vous connecter en indiquant seulement le nom de l'utilisateur, comme toto pour toto@itinet.fr

Dans la rubrique "Logo et marque", modifiez le titre de la page pour personnaliser ce qui s'affichera dans l'onglet, comme par exemple "Le webmail de toto", puis actualisez la page :

Le nom de notre webmail apparait bien dans l'ongletLe nom de notre webmail apparait bien dans l'onglet
 

Enfin, le dernier point auquel vous pourrez faire attention est l'onglet "A propos" qui permet notamment de faire les mises à jour de Rainloop. Ce qui est toujours un bon réflexe pour la sécurité. Votre webmail devrait être à jour, mais voici ce que vous verrez s'il ne l'est pas :

Une nouvelle version est disponible.Une nouvelle version est disponible.
 

Un simple clic sur "Mettre à jour" fera toute l'installation nécessaire.

Notre webmail est prêt, il est maintenant temps de le tester !

Connexion au webmail

Pour nous connecter au webmail nous allons d'abord nous déconnecter de l'interface d'administration en cliquant en haut à droite sur le bouton de déconnexion.

Puis nous allons enlever ?admin à notre URL pour tomber à la racine de rainloop. La page de connexion n'est pas très différente :

Deux champs pour le login et le mot de passeDeux champs pour le login et le mot de passe
 

 Nous allons indiquer nos identifiants de connexion IMAP, soit toto@itinet.fr et motDePasseDeToto

Et nous voilà connectés à notre webmail !

Nous pouvons voir nos mails !Nous pouvons voir nos mails !
 

Et nous pouvons déjà voir les premiers mails que nous avions envoyés à la main lors de nos tests SMTP. En cliquant sur les mails, on accède à leur contenu.

Vous pouvez aussi envoyer des mails à la terre entière, comme nous l'avions fait pour tester notre serveur SMTP, en cliquant sur "Nouveau"

Interface d'envoi d'un mailInterface d'envoi d'un mail
 

Et si tout se passe bien, notre mail devrait être reçu par notre interlocuteur !

Mail reçu par notre interlocuteurMail reçu par notre interlocuteur
 

Attention cependant, vu que notre serveur n'est pas encore parfaitement configuré ou sécurisé, il est possible que certains serveurs de messagerie rejette un premier mail envoyé ou retarde sa réception pour lutter contre le spam, comme nous l'avions vu pour le serveur SMTP.

Conclusion

Voilà, nous avons une solution de messagerie complète avec :

Il y a encore beaucoup d'améliorations possibles, notamment en sécurisant notre serveur SMTP, en activant l'authentification SMTP ou en passant notre webmail en HTTPS pour en chiffrer les accès.

Cela vous laisse un champ d'exploration important, cependant, nous allons encore voir ensemble comment nous allons pouvoir simplifier l'administration de notre serveur de messagerie en automatisant une partie des tâches qu'il peut effectuer.